#ifndef MANAGER
#define MANAGER

#include <vector>
#include <map>
#include <list>
#include <set>
#include <deque>
#include <iostream>
#include <string>
#include <tuple>
#include <algorithm>
#include "platform.h"
#include "robot.h"


class _platform_cmp
{
public:
    bool operator()(const TPlatform* lhs, const TPlatform* rhs){
        return lhs < rhs;
    }
};
class _robot_cmp
{
public:
    bool operator()(const TRobot* lhs, const TRobot* rhs){
        return lhs < rhs;
    }
};

bool sort_rule(const pair<TPlatform*,TPlatform*> a, const pair<TPlatform*,TPlatform*> b);

class TManager
{
public:
    vector<TPlatform*> platforms;                               ///> 所有平台
    vector<TRobot*> robots;                                     ///> 所有机器人,0开始
    vector<TPlatform*> plat_456;                                ///> 装456的所有平台
    vector<TPlatform*> plat_123;                                ///> 装123的所有平台
    vector<TPlatform*> plat_7;                                  ///> 装7的所有平台
    vector<TPlatform*> plat_8;                                  ///> 装8的所有平台
    vector<TPlatform*> plat_9;
    vector<TPlatform*> plat_1234567;
    map<TPlatform*, int, _platform_cmp> fast_plat;              ///> 用于快速比较平台对象
    vector<TPlatform*> plat_full_456;                           ///> 平台生产格满了，材料格也满了/马上满了,用于买卖函数
    vector<TPlatform*> plat_full_4;
    vector<TPlatform*> plat_full_5;
    vector<TPlatform*> plat_full_6;
    vector<TPlatform*> plat_fulland1free;
    vector<TPlatform*> plat_fulland2free;
    vector<TPlatform*> plat_freeand1;
    vector<TPlatform*> plat_freeand2;
    vector<TPlatform*> plat_busyand1;
    vector<TPlatform*> plat_busyand2;
    vector<TRobot*> robot_empty_rob;                            ///> 空机器人，找full平台
    vector<TRobot*> robot_pay_buy;                              ///> 满机器人，在target平台，进行买卖  --------------->下一帧要买卖
    map<TRobot*, int, _robot_cmp>  busy_robot_target_platform;  ///> 有目标的机器人  （机器人,平台）--------->进行轨迹运动
    vector<TRobot*> destroy;

    int frameID;
    int total_used = 0;
    bool avoid_on = true;
    int map_num = 0;

public:
    /**
     * 管理器初始化
     */
    virtual int Init(vector<string>& buff);

    /**
     * 运行一次
     */
    virtual void RunOnce(vector<string> &frame);


private:
    /**
     * 读每帧的信息
     */
    int Read(vector<string>& buff);

    /**
     *
     */
    void Write();

    /**
     *
     */
    void Clear();

    /**
     * 控制机器人总接口
     */
    void ControlRobot();

    /**
     * 方案1
     */
    void DoDeal1();

    /**
     * 方案2
     */
    void DoDeal2();

    /**
     * 方案3
     */
    void DoDeal3();

    /**
     * 方案4
     */
    void DoDeal4();

    /**
     * 转移任务
     */
    void TransferTask(TRobot* ro,multimap<TRobot *, std::pair<bool, int>>& wn);

    /**
     * 处理买入卖出
     */
    void DealPayBuy();

    void FillSellAndBuyMap(vector<TPlatform*> &last_level, vector<TPlatform*> &next_level);

    void EraseWorkingNumber(multimap<TRobot *, std::pair<bool, int>>& wn,std::tuple<bool, int, TPlatform *>& wq_task,TRobot* ro);

    void MonitorRobot(TRobot* ro);

    void WaitSellMonitorPlat7(TPlatform* plat_7);

    void SellMonitorPlat7(TPlatform* plat_7);

    int FullFirst(TRobot* ro);

    int DistanceFirst(TRobot* ro);

    int KSort(TPlatform* pla,TRobot* rob, double k);

    void PlaSellTaskNoTake_123_456(TPlatform* pla,TRobot* rob);

    void PlaSellTaskNoTake_456_79(TPlatform* pla,TRobot* rob);

    void PlaSellTaskNoTake_7_89(TPlatform* pla,TRobot* rob);

    void Scanner(vector<vector<pair<double,double>>> &scan_line,vector<pair<double,double>> &memo_v_r);

    void Avoid(int &v,double &rotate,pair<TRobot*,int> it,vector<vector<pair<double,double>>> &scan_line,vector<pair<double,double>> &memo_v_r);
};



#endif